/*
 * @lc app=leetcode.cn id=350 lang=javascript
 *
 * [350] 两个数组的交集 II
 */

// @lc code=start
/**
 * @param {number[]} nums1
 * @param {number[]} nums2
 * @return {number[]}
 */
var intersect = function (nums1, nums2) {
    let arr = []
    let hash1 = {}
    let hash2 = {}
    nums1.forEach((i)=>{
        if(!hash1[i]){hash1[i]=1}
        else{hash1[i]++}
    })
    
    nums2.forEach((i)=>{
        if(!hash2[i]){hash2[i]=1}
        else{hash2[i]++}
    })
   for(let i in hash1){
       if(hash2[i]){
        for(let j=0;j<Math.min(hash1[i],hash2[i]);j++){
            arr.push(i)
        }
       }
   }
   console.log(hash1,hash2)
    return arr    
};
// @lc code=end

const intersect = (nums1, nums2) => {
    nums1.sort((a, b) => a - b);
    nums2.sort((a, b) => a - b); // 先排序，使得重复的元素相邻出现
    const res = [];
    let p1 = 0;                  // 两个指针
    let p2 = 0;
    while (p1 < nums1.length && p2 < nums2.length) { // 用&& 因为有一个越界了就不能找交集
      if (nums1[p1] > nums2[p2]) {        // p1指向的数大，移动p2，期待遇到一样大的
        p2++;
      } else if (nums1[p1] < nums2[p2]) { // 类似
        p1++;
      } else {                   // 遇到相同的，推入res数组，两个指针同时移动考察下一个
        res.push(nums1[p1]);
        p1++;
        p2++;
      }
    }
    return res;
  };
  
  